<?php

declare(strict_types=1);

namespace ImiApp\ApiServer\Api\Controller\order;

use Imi\Db\Db;
use Imi\Server\Http\Route\Annotation\Action;
use Imi\Server\Http\Route\Annotation\Controller;
use Imi\Server\Http\Route\Annotation\Route;
use Psr\Http\Message\ResponseInterface;
use Imi\Aop\Annotation\Inject;
// use Phpben\Imi\Validate\Annotation\Validate;
use Phpben\Imi\Auth\Annotation\Auth;
use Imi\Config;

/**
 * 普通商品订单
 * @Auth(name="token",nologin={"no"})
 * @Controller("/order.pay/")
 */
class Pay extends OrderBean
{

    //如果$noNeedLogin为空表示所有接口都需要登录才能请求
    //如果$noNeedRight为空表示所有接口都需要验证权限才能请求
    //如果接口已经设置无需登录,那也就无需鉴权了
    //
    // 无需登录的接口,*表示全部
    protected $noNeedLogin = ['*'];
    // 无需鉴权的接口,*表示全部
    protected $noNeedRight = ['*'];

    /**
     * 支付订单
     *
     * @param  $order_data
     * @return void
     */
    public function pay_order_total($order_data)
    {
        //判断什么支付
        $user = Db::name('user')->where('id', '=', $order_data['user_id'])->find();

        if ($order_data['score_fee'] > 0) {
            if ($order_data['score_fee'] > $user['score']) {
                throw new \ErrorException('积分不足', CODE_积分不足);
            }
        }

        if ($order_data['shell_fee'] > 0) {
            if ($order_data['shell_fee'] > $user['shell']) {
                throw new \ErrorException('贝壳不足', CODE_贝壳不足);
            }
        }

        //  //pay_type 支付方式:wechat=微信支付,alipay=支付宝,wallet=钱包支付,score=积分支付,shell=贝壳支付,mix=混合支付
        switch ($order_data['pay_type']) {
            case 'wechat':
                //生成微信支付
                $order_data['msg'] = '暂未生成微信支付';
                return ['微信支付', $order_data, PAY_WECHAT_APP];
                break;
            case 'alipay':
                //生成支付宝支付
                $order_data['msg'] = '暂未生成支付宝支付';
                return ['支付宝支付', $order_data, PAY_ALIPAY];
                break;
            case 'wallet':
                //钱包支付
                if ($order_data['score_fee'] > 0 || $order_data['shell_fee'] > 0) {
                    $str = '订单混合支付钱包';
                } else {
                    $str = '订单钱包支付';
                }

                if ($order_data['pay_fee'] > 0) {
                    if ($order_data['pay_fee'] > $user['money']) {
                        throw new \ErrorException('余额不足', CODE_余额不足);
                    }
                }


                if ($order_data['pay_fee'] > 0)
                    $this->DecUserMoney($order_data['user_id'], $order_data['pay_fee'], $str, 12, $order_data['id']);


                //减去 积分
                if ($order_data['score_fee'] > 0)
                    $this->DecUserScore($order_data['user_id'], $order_data['score_fee'], $str, 12, $order_data['id']);

                //减去 贝壳
                if ($order_data['shell_fee'] > 0)
                    $this->DecUsershell($order_data['user_id'], $order_data['shell_fee'], $str, 12, $order_data['id']);

                $this->payOrderTotalSuccess($order_data); //支付成功
                return ['钱包支付成功', $order_data, PAY_WALLET];
                //减去钱包支付
                // 修改订单状态
                // 支付成功回掉
                break;
            case 'score':

                break;
            case 'shell':

                if ($order_data['pay_fee'] > 0) {
                    if ($order_data['pay_fee'] > $user['money']) {
                        throw new \ErrorException('余额不足108', CODE_余额不足);
                    }
                }
                if ($order_data['pay_fee'] > 0)
                    $this->DecUserMoney($order_data['user_id'], $order_data['pay_fee'], '订单混合支付钱包', 12, $order_data['id']);


                //减去 积分
                if ($order_data['score_fee'] > 0)
                    $this->DecUserScore($order_data['user_id'], $order_data['score_fee'], '订单混合支付钱包', 12, $order_data['id']);

                //减去 贝壳
                if ($order_data['shell_fee'] > 0)
                    $this->DecUsershell($order_data['user_id'], $order_data['shell_fee'], '订单混合支付钱包', 12, $order_data['id']);

                $this->payOrderTotalSuccess($order_data); //支付成功
                break;
            case 'mix':

                if ($order_data['pay_fee'] > 0) {
                    if ($order_data['pay_fee'] > $user['money']) {
                        throw new \ErrorException('余额不足129', CODE_余额不足);
                    }
                }
                // var_dump('混合付款',$order_data);
                if ($order_data['pay_fee'] > 0)
                    $this->DecUserMoney($order_data['user_id'], $order_data['pay_fee'], '订单混合支付', 12, $order_data['id']);
                //减去钱包的钱 

                //减去 积分
                if ($order_data['score_fee'] > 0)
                    $this->DecUserScore($order_data['user_id'], $order_data['score_fee'], '订单混合支付', 12, $order_data['id']);

                //减去 贝壳
                if ($order_data['shell_fee'] > 0)
                    $this->DecUsershell($order_data['user_id'], $order_data['shell_fee'], '订单混合支付', 12, $order_data['id']);


                $this->payOrderTotalSuccess($order_data); //支付成功
                return ['混合支付成功', $order_data, PAY_MIX];

                // $order['pay_fee'] = $订单优惠后总价  + $运费总价; //实际支付金额 - 扣除积分 -贝壳等!!!!!!!!!!
                // $order['score_fee'] = $params['score'];
                // $order['shell_fee'] = $params['shell'];
                // $order['score_money_fee'] = 0; //积分服务费金额


                break;

            default:
                # code...
                break;
        }
    }

    /**
     * 支付订单成功
     *
     * @param array $order_data
     * @return void
     */
    public function payOrderTotalSuccess($order_data)
    {
        //支付订单成功
        //修改订单完成
        Db::name('order_total')->where('id', '=', $order_data['id'])->update(['pay_status' => '2', 'pay_time' => time(), 'pay_type' => $order_data['pay_type']]);
        //修改子订单下面的订单
        Db::name('order')->whereIn('id', explode(',', $order_data['order_ids']))->update(['pay_type' => $order_data['pay_type'], 'paytime' => time(), 'status' => '1']);
        Db::name('order_item')->whereIn('order_id', explode(',', $order_data['order_ids']))->update(['status' => '1']);

        //用户按总金额来(pay_fee)
        //店铺按order来算

        $queue2 = \Imi\Queue\Facade\Queue::getQueue('order');
        $message2 = new \Imi\Queue\Model\Message;
        //发布对列
        $message2->setMessage(json_encode(['type' => 'order_total_pay_success', 'data' => $order_data], JSON_UNESCAPED_UNICODE));
        $queue2->push($message2);


        // $ids = Db::name('order_item')->where('status','=','1')->column('id');
        // $order_data['order_ids'] = implode(',',$ids);
        // $message2->setMessage(json_encode(['type' => 'order_total_pay_success', 'data' => $order_data], JSON_UNESCAPED_UNICODE));
        // $queue2->push($message2);




        // //后面可以走队列分佣金
        // var_dump('支付成功后子订单', $order_data['order_ids']);
        // //给平台加买家支付积分手续费——————————————————————————————————————————————————————————————————————————————————————————————————
        // if ($order_data['score_money_fee'] > 0) {
        //     $sysdata['oper_type'] = 'system'; //提成人类型:user=买家,store=卖家,admin=管理,system=平台,after=售后站,run=运营中心
        //     $sysdata['order_total_id'] = $order_data['id'];
        //     $sysdata['money'] = $order_data['score_money_fee'];
        //     $_平台积分手续费结果_ = Db::name('commission')->whereEx($sysdata)->find();
        //     if (!$_平台积分手续费结果_) {
        //         $sysdata['time']  = time();
        //         // $sysdata['low_id'] = $order_data['user_id'];

        //         $sysdata['oper_id'] = 0; //
        //         $sysdata['ps'] = '买家下单,积分手续费';
        //         Db::name('commission')->insert($sysdata);
        //         $this->IncSysinfoMoney($order_data['score_money_fee'], '买家下单,积分手续费', 1, $order_data['id']);
        //     }
        // }

        // //给平台加卖家支付贝壳手续费('买家下单')——————————————————————————————————————————————————————————————————————————————————————————————————





        // // $list = Db::name('order')->whereIn('id', explode(',', $order_data['order_ids']))->select()->getArray();
        // $list = Db::name('order_item')->whereIn('order_id', explode(',', $order_data['order_ids']))->select()->getArray();

        // foreach ($list as $key => $val) {
        //     var_dump($val['total_fee']);
        //     //返贝壳
        //     if ($val['total_fee'] > 0) {
        //         // 买家返贝壳 = 卖家的现金服务费% 75*	商品分类在折扣比  10%* 现金1000 *支付现金贝壳返现% 50
        //         // 37.5个贝壳
        //         $store_id = $val['store_id'];
        //         $store = Db::name('store')->where('id', '=', $store_id)->find();
        //         $goods = Db::name('goods')->where('id', '=', $val['goods_id'])->find();
        //         $data['order_item_id'] = $val['id'];
        //         $data['oper_type'] = 'user';
        //         $data['oper_id'] = $val['user_id'];
        //         $data['money_type'] = 'shell'; //金额类型:money=钱,shell=贝壳,score=积分
        //         $res = Db::name('commission')->whereEx($data)->find();
        //         if (!$res) {
        //             $现金服务费比例 = $this->GetSetserverstoreVal($store_id, $store['set_id'], 8); //1=拍卖技术费%(邮寄,2=拍卖技术费%(服务,3=拼团技术费%(邮寄,4=拼团技术费%(服务,5=贝壳服务费%,6=积分服务费%,7=调货费%,8=现金服务费%(邮寄,9=现金服务费%(服务,10=立即买单%,11=保证金阀值(元),12=借米额度(M倍),13=贝壳转移服务费%,14=提现手续费%
        //             $现金服务费比例 = $this->ChangeRatio($现金服务费比例);
        //             $data['money'] = $val['total_fee'] * $现金服务费比例 * $goods['goods_service_ratio'];

        //             $data['time'] = time();
        //             $data['low_id'] = '';

        //             $data['ps'] = '买家下单,现金支付返贝壳';
        //             $data['freeze_status'] = '2';
        //             Db::name('commission')->insert($data);
        //             \Imi\Log\Log::info('买家下单,现金支付返贝壳' . $data['money'] . '=' . $val['total_fee'] . '*' . $现金服务费比例 . '*' . $goods['goods_service_ratio']);
        //         }
        //     }
        // }


        // `order_total_id` int(10) DEFAULT NULL COMMENT '总订单id',
        // `order_id` int(10) DEFAULT NULL COMMENT '订单id',
        // `order_item_id` int(10) DEFAULT NULL COMMENT '子订单id',
        // `money` decimal(10,2) DEFAULT NULL COMMENT '金额',
        // `money_type` enum('money','shell','score') DEFAULT NULL COMMENT '金额类型:money=钱,shell=贝壳,score=积分',
        // `time` int(10) DEFAULT NULL COMMENT '时间',
        // `low_id` int(10) unsigned DEFAULT NULL COMMENT '下级id',
        // `status` enum('1','2','3','6','4','5') DEFAULT NULL COMMENT '类型:1=1级提成,2=2级提成,3=3级提成,6=经销商提成',
        // `oper_type` enum('user','store','admin','system','after','run') NOT NULL COMMENT '提成人类型:user=买家,store=卖家,admin=管理,system=平台,after=售后站,run=运营中心',
        // `oper_id` int(11) NOT NULL DEFAULT '0' COMMENT '提成人id',
        // `ps` varchar(255) DEFAULT NULL COMMENT '备注',
        // `freeze_status` enum('1','2') DEFAULT '2' COMMENT '冻结状态:1=已到账,2=冻结中,3=失效',
        // `thaw_time` int(10) unsigned DEFAULT NULL COMMENT '解冻时间',

        //->生成对应提成 
    }
}
